package cn.avalon.feign;

import cn.avalon.domain.User;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;

/**
 * @description: 调用User服务的feign客户端
 * @author: Avalon
 * @date: 2022年09月17日 ： 10:53
 * @version: ver1.0
 * @email 709785494@qq.com
 *  openfeign原理
 *  1.@EnableFeignClients：此注解有两个功能
 *         1.代表开启feign功能
 *         2.它会自动扫描加了该注解的类的同级目录以及以下所有目录中加了@FeignClient注解的所有接口
 *             找到feign接口之后，他会使用动态代理帮助我们创建实现类，并且还会交给spring管理
 *         3.在代理类的方法体中，它会拿到@FeignClient中我们写的服务名称+我们自己在接口方法上面写的接口路径
 *             再拿到我们调用方法时传递进来的参数，再拿到方法返回值，拼接成："http://user-service/user/getUserById/" + id;
 *             进行Http接口调用
 */
// 表示该接口是一个feign接口，我们需要指定被调用方的服务名称
// 当注解有多个参数时，那么每个参数名称必须写上
// name属性指定被调用服务的服务名称  fallbackFactory属性指定托底方法对应工厂类的字节码
@FeignClient(value = "user-service", fallbackFactory = UserServiceFallbackFactory.class) // 指定需要调用的服务的应用名称
@RequestMapping("/user")
public interface UserFeignClient {

    @GetMapping("/{id}")
    User findUserById(@PathVariable("id") Long id);
}
